package cn.xumaoyang.basic.Interceptor;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.TimeUnit;



/**
 *  拦截器。
 *
 * @Component  交给容器管理。
 * HandlerInterceptor  必须实现这个类。
 *  重写类中 preHandle 方法。
 *
 */
@Component //一定要交给spring管理。
public class LoginInterceptor implements HandlerInterceptor{

    //注入redis，因为我们需要token，而token在redis中。
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
            //从请求头获取到token。
        String token = request.getHeader("token");
        //如果在请求头中存在token，证明用户登录了。
        if(!StringUtils.isEmpty(token)){
            //在redis中根据key获取到值。
            Object o = redisTemplate.opsForValue().get(token);
            //判断是否为空
            if(o != null){
                redisTemplate.opsForValue().set(
                        token,  //
                        o,   //token的数据。
                        30,  //时间长度
                        TimeUnit.MINUTES //时间类型为分钟。
                 );
                //并且放行。
                return true;
            }
        }
        response.setContentType("application/json;charset=utf-8"); //编码集不管。
        response.setCharacterEncoding("UTF-8"); //解码集。不管
        PrintWriter writer = response.getWriter(); //这里也不管。
        writer.write("{\"success\":false,\"message\":\"noLogin\"}");  //这里是如果报错，就传递给前端第三个拦截器操作。
        writer.flush();
        writer.close();
        //不放行
        return false;
    }
}
